'''
股市常用知识和数据准备：
首先，用通俗易懂的语句讲述股票交易的知识和常见术语，通过“竞价制度”来了解“股票为什么会涨跌”这个本源问题
然后，准备数据：用各种python库，从网页等渠道，下载股票数据，并保存到csv文件中。

股票：股份制有限公司为了募集资金发型的股份证书。股票可以转让，买卖，抵押。交易单位多为1手 = 100股。
证券交易所：大陆有上海、深圳、北京三个大型交易市场，还有创业板...
(连续竞价)交易时间：除法定节假日外的周一～周五，上午9:30～11:30，下午1:00～3:00
集合竞价时间：上午9:15～9:25
交易规则：T+1 当天买入，当天不能卖出

竞价制度来分析股票为什么涨跌？
竞价制度：集合竞价和连续竞价
集合竞价：投资者按照心理价位申报股票买卖价格，交易所对有效维度进行一次集中撮合。如果委托单未成交，就自动进入联系竞价的交易流程
集合竞价交易规则：不安时间和价格优先规则，只遵循最大交易量原则来定出股票价位
流程：
  1. 确认有效委托。根据上一日收盘价 + 确定的涨跌幅度 => 最高限价 和 最低限价
  2. 选取成交价位。在有效价格范围内，选取使所有委托产生最大交易量的价位，多个另做判断
  3. 集中戳和。按委托时间、价位，依次撮合
  4. 行情揭示。未成交的委托单，自动进入连续竞价

指数：交易所或金融机构计算出来的指示数字，基本上就是价格的平均数。常见上证综合指数、沪深300指数等等
板块：某一些股份公司具有某些特性，然后以该属性命名归类形成板块
行业板块：证监会对上市公司提出的官方的分类标准
概念板块：没有统一标准，如华为概念股

术语：
牛市（长期看涨）/熊市（长期看跌）/多头（逢低买进）/空头（逢高卖出）/利多/利空
空仓/满仓/建仓/减仓/仓位
追涨（不管价位看涨就买的行为）/杀跌（不管本金怎样一跌就卖的行为）/长线/短线
主力（持股多，不一定是庄家，不能操纵股价，只能影响）/筹码/庄家（可操作股价）
蓝筹股（行业业绩领头羊）/龙头股（股票炒作中的领头羊）
支撑线（抵抗线，多方在此买入阻止下跌）/阻力线（空方在此卖出上涨停止）
技术指标：泛指一切可通过数学公式计算出的股票数据集合，常见有：相对强弱指标RSI，随机指标KDJ，趋向指标DMI，平滑异同平均线MACD等
黄金交叉（金叉）：上升的中短期指标曲线由下而上穿过长期指标曲线，表示股价将持续上涨
死亡交叉（死叉）：下降的中短期指标曲线由上而下穿过长期指标曲线，表示股价将继续下降
背离：技术指标曲线和价格完全相反

股票相关常用的Python库：
os
shutil
pandas_datareader 远程获取金融数据的第三方工具
urllib 用get和post方式抓取网络数据的标准库
requests 基于urllib的第三方库
pandas 第三方库，包含标准数据模型，能高效操作大型数据集
re 标准核心库，处理正则表达式
matplotlib 第三方库，实现可视化功能，例如绘制股票指标
Tushare 开源的第三方财经数据接口包，封装了用于采集分析和加工股票等金融数据的功能
Numpy 第三方库，
'''

# 开始爬取股市数据，下面我们来爬取一下东方财富的华友钴业的数据
# https://push2his.eastmoney.com/api/qt/stock/kline/get?cb=jQuery35105858981712992417_1697981029563&secid=1.603799&ut=fa5fd1943c7b386f172d6893dbfba10b&fields1=f1%2Cf2%2Cf3%2Cf4%2Cf5%2Cf6&fields2=f51%2Cf52%2Cf53%2Cf54%2Cf55%2Cf56%2Cf57%2Cf58%2Cf59%2Cf60%2Cf61&klt=60&fqt=1&beg=0&end=20500101&smplmt=460&lmt=1000000&_=1697981029656
# 从上面的url中可以解析到如下知识点：
# jsonp cb=jQuery35105858981712992417_1697981029563
# secid=1.603799  603799是股票代码
# ut=fa5fd1943c7b386f172d6893dbfba10b
# fields1=f1,f2,f3,f4,f5,f6
# fields2=f51,f52,f53,f54,f55,f56,f57,f58,f59,f60,f61
# klt=60  60分钟时线
# fqt=1
# beg=0
# end=20500101
# smplmt=460
# lmt=1000000
# _=1697981029656
# 返回结果：2023-10-16 10:30,37.02,35.90,37.15,35.67,130930,472879786.00,4.00,-2.95,-1.09,0.78
# 结果解析：时间，开盘，收盘，最高，最低，成交量，成交额，振幅，涨跌幅，涨跌额，换手率
from json import JSONDecoder
from urllib.request import urlopen, urlretrieve


stockCode = '603799'
# url = 'https://push2his.eastmoney.com/api/qt/stock/kline/get?cb=mycallback&secid=1.603799&ut=fa5fd1943c7b386f172d6893dbfba10b&fields1=f1%2Cf2%2Cf3%2Cf4%2Cf5%2Cf6&fields2=f51%2Cf52%2Cf53%2Cf54%2Cf55%2Cf56%2Cf57%2Cf58%2Cf59%2Cf60%2Cf61&klt=60&fqt=1&beg=0&end=20500101&smplmt=460&lmt=1000000&_=1697981029656'
# 如果不指定callback名字，这样服务器就会直接返回数据而不是用函数包裹
# 不然可以通过字符串切片或者正则表达式来提取数据
url = 'https://push2his.eastmoney.com/api/qt/stock/kline/get?cb=&secid=1.603799&ut=fa5fd1943c7b386f172d6893dbfba10b&fields1=f1%2Cf2%2Cf3%2Cf4%2Cf5%2Cf6&fields2=f51%2Cf52%2Cf53%2Cf54%2Cf55%2Cf56%2Cf57%2Cf58%2Cf59%2Cf60%2Cf61&klt=60&fqt=1&beg=0&end=20500101&smplmt=460&lmt=1000000&_=1697981029656'
# response = urlopen(url)
# 如果返回结果中有中文，因此需要utf-8解码
# data = response.read().decode('utf-8')
# print(JSONDecoder(data))
# print(data.data)
# print(data.data.klines)
# 调用close方法关闭response对象
# response.close()

# 爬取数据并存储到指定文件
urlretrieve(url, './'+stockCode+'.csv')